const koa = require('koa');
const koaStaticCache = require('koa-static-cache');
const koaBodyParser = require('koa-bodyparser');
const router = require('./router/index')
const session = require('koa-session'); // 替代登录成功后，用cookie保存登录态

// 测试jwt =====
const jwt = require('jsonwebtoken')
const secret = 'jwt demo'
const jwtKoa = require('koa-jwt')
const util = require('util')
const verify = util.promisify(jwt.verify) // 解密

const app = new koa();

// 静态资源
app.use(koaStaticCache('./static', {
    prefix:'static',
    gzip: true
}))

// 解析参数
app.use(koaBodyParser())

// 设置签名的 Cookie 密钥
app.keys = ['message'];  // 秘钥 https://koa.bootcss.com/
// 可以自定义秘钥，和算法
// app.keys = ['im a newer secret', 'i like turtle'];
// app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');


// 用session替代cookie的登录态, 这样cookie是加密的 就算修改了 也不一定正确
// 而下一次请求呢，会自动带上cookie，然后通过koa-session ctx.seesion.uid自动获取自动解密获取 匹配判断，就可以了 https://www.npmjs.com/package/koa-session
// koa-session 需要设置 app.keys 秘钥
app.use(session({
    key: 'koa:message',
    maxAge: 86400000,
    autoCommit: true,
    overwrite: true,
    httpOnly: true,
    signed: false,
    rolling: false,
    renew: false
}, app));



// 跨域
// app.use( async (ctx, next) => {
//     ctx.set('Access-Control-Allow-Origin', '*');
//     await next();
// })

// 挂载路由
app.use(router.routes());
app.use(router.allowedMethods());

// 处理jwt=========================
// 处理 jwt错误
app.use( async (ctx, next) => {
    try {
        await next()
    } catch (err) {
        console.log('1-----------', err)
    }

    return await next().catch((err) => {
        console.log('jwt错误', err.name)
        if(err.status === 401){
            // ctx.status = 401;
            ctx.body = {
                code: 10401,
                msg: 'Protected resource, use Authorization header to get access'
            };
        }else{
            throw err;
        }
    })
})

app.use(jwtKoa({secret}).unless({
    path: [ //数组中的路径不需要通过jwt验证
        /^\/login/,/^\/list/
        // ,/^\/like/
    ]
}))
// 处理jwt=========================

app.on('error',async (err,ctx) => {
    console.log('err ->', err);
});

app.listen(3000)